#!/bin/bash

# 系统资源监控脚本。
# 监控CPU、内存、磁盘使用率，超过阈值自动邮件告警。
# 无告警时显示当前使用率并退出。

# 配置参数
CPU_THRESHOLD=80       # CPU使用率阈值(%)
MEM_THRESHOLD=80       # 内存使用率阈值(%)
DISK_THRESHOLD=85      # 磁盘使用率阈值(%)
ALERT_EMAIL="admin@example.com"  # 告警接收邮箱

# 标记是否有告警
has_alert=0

# 发送告警邮件函数
send_alert() {
    local subject="$1"
    local message="$2"
    echo "$message" | mail -s "$subject" "$ALERT_EMAIL"
    has_alert=1
}

# 监控CPU使用率
check_cpu() {
    local cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}' | awk -F. '{print $1}')
    echo "CPU使用率: $cpu_usage% (阈值: $CPU_THRESHOLD%)"
    
    if [ "$cpu_usage" -gt "$CPU_THRESHOLD" ]; then
        local subject="CPU使用率告警 - $(hostname)"
        local message="CPU使用率过高: $cpu_usage% (阈值: $CPU_THRESHOLD%)\n时间: $(date)"
        send_alert "$subject" "$message"
        echo "⚠️ CPU告警已发送"
    fi
}

# 监控内存使用率
check_memory() {
    local mem_usage=$(free | grep Mem | awk '{print $3/$2 * 100.0}' | awk -F. '{print $1}')
    echo "内存使用率: $mem_usage% (阈值: $MEM_THRESHOLD%)"
    
    if [ "$mem_usage" -gt "$MEM_THRESHOLD" ]; then
        local subject="内存使用率告警 - $(hostname)"
        local message="内存使用率过高: $mem_usage% (阈值: $MEM_THRESHOLD%)\n时间: $(date)"
        send_alert "$subject" "$message"
        echo "⚠️ 内存告警已发送"
    fi
}

# 监控磁盘使用率
check_disk() {
    local disk_usage=$(df -h / | grep -v Filesystem | awk '{print $5}' | sed 's/%//g')
    echo "磁盘使用率: $disk_usage% (阈值: $DISK_THRESHOLD%)"
    
    if [ "$disk_usage" -gt "$DISK_THRESHOLD" ]; then
        local subject="磁盘使用率告警 - $(hostname)"
        local message="磁盘使用率过高: $disk_usage% (阈值: $DISK_THRESHOLD%)\n时间: $(date)"
        send_alert "$subject" "$message"
        echo "⚠️ 磁盘告警已发送"
    fi
}

# 主程序
echo "===== 系统资源检查: $(date) ====="
check_cpu
check_memory
check_disk
echo "=================================="

# 根据是否有告警返回不同的退出码
if [ $has_alert -eq 1 ]; then
    echo "检测到资源使用率超过阈值，已发送告警邮件"
    exit 1  # 有告警时返回非0退出码
else
    echo "所有资源使用率均在正常范围内"
    exit 0  # 无告警时返回0退出码
fi
